[2024年8月新機能]UNDROPコマンド時にデータベース・スキーマ・テーブルのオブジェクトIDを指定できるようになりました
さがらです。
2024年8月の新機能で、UNDROPコマンド時にデータベース・スキーマ・テーブルのオブジェクトIDを指定できるようになりました。
このコマンドにより、例えばあるテーブルを削除したあと同じ名称のテーブルを作成してしまったとき、最初のテーブルのUNDROPによる復元がより楽になりました。
実際にどのように変化したのか、本記事でまとめてみます。
従来のプロセス
まず、下記のSQLを実行してテーブルを作成しDROPしたあとに、全く同じ名称でテーブルを作成してDROPします。
-- 後々復元したいテーブルを作成し、削除
create table aaa as
select
1 as col1,
2 as col2,
3 as col3;
select * from aaa;
drop table aaa;
-- 全く同じテーブル名で、値を変更して作成して削除
create table aaa as
select
11 as col1,
22 as col2,
33 as col3;
select * from aaa;
drop table aaa;
このあと、一番最初に作成したテーブルを復元するには、一度UNDROPをした後に2番目に作成したテーブルを一度RENAMEした上で再度UNDROPコマンドを打つ必要がありました。これが従来のプロセスです。
-- 一度aaaをundropすると、一番直近で削除した方が復元されてしまうため、RENAMEする
undrop table aaa;
alter table aaa rename to aaa_latest;
-- もう一度、aaaをundropする
undrop table aaa;
-- 無事に、一番最初のaaaテーブルがクエリできる
select * from aaa;
新機能を用いたプロセス
では、2024年8月にリリースされた新機能を使ったプロセスがどうなるのかまとめてみます。
-- 後々復元したいテーブルを作成し、削除
create table bbb as
select
1 as col1,
2 as col2,
3 as col3;
select * from bbb;
drop table bbb;
-- 全く同じテーブル名で、値を変更して作成して削除
create table bbb as
select
11 as col1,
22 as col2,
33 as col3;
select * from bbb;
drop table bbb;
このあと、対象のテーブルについて、account_usage.tables
でテーブルIDを確認します。
注意点としては、information_schema.tables
にはtable_id
列が存在しないため、account_usage.tables
を必ず見る必要があるということです。そしてaccount_usage
内のビューのため、即時に更新されるわけではありません。(ドキュメント上は更新まで最大90分かかると記載がありました)
-- bbbのテーブルIDを確認
select table_id,
table_name,
table_schema,
table_catalog,
created,
deleted,
comment
from snowflake.account_usage.tables
where
table_name = 'BBB'
and deleted is not NULL
order by deleted;
この上で、確認したテーブルIDを元に下記のUNDROPコマンドを実行します。すると、最初にDROPした方のテーブルが無事に復元されました!
-- IDを指定して、undropする
undrop table identifier(4207663);
-- 無事に、一番最初のbbbテーブルがクエリできる
select * from bbb;
最後に
2024年8月の新機能で、UNDROPコマンド時にデータベース・スキーマ・テーブルのオブジェクトIDを指定できるようになりましたので、同名のテーブルが複数あった場合の復元プロセスがどのように改善できたかを本記事でまとめてみました。
いざというときに役立つと思うので、参考になると嬉しいです!